Cocoapods - 私有化pod实践

Spec仓库

Spec是Pods索引库,所有公开的Pods都在这个里面,它实际是一个Git仓库 remote端在GitHub上,当使用了Cocoapods后他会被clone到本地的~/.cocoapods/repos目录下,进入到这个目录看到master文件夹就是这个官方的Spec Repo了。

每次我们在执行pod install或者是pod update的时候都会自动更新这个spec里面的内容,拉取最新的数据回来。然后我们使用pod search的时候就是直接从这个里面进行查询的。

向CocoaPods添加私有仓库

pod repo add 仓库名 仓库地址
// 示例
pod repo add MySpecs git@gitlab.xxxxx.com:hao01.zhang/MySpecs.git

可以通过 cd ~/.cocoapods/repos 这个目录里面检查是否创建好具体的私有库,添加成功之后可以通过pod repo list的命令查看

pod repo list

删除本地一个私有Spec Repo

pod repo remove MySpecs

更新本地一个私有Spec Repo

pod repo update MySpecs

使用Cocoapods模板创建demo

pod lib create 组件名
// 示例
pod lib create MyTest

接下来会有五步的交互:

podlibcreate_guide

完成后项目会自动打开,然后替换pod下面的Development Pods下的ReplaceMe.m文件为你的源码组件

podReplaceMe

代码文件放到Classes目录下,如果有资源文件则需要放到Assets 目录下。完成之后cd到example目录下执行pod update,重新打开工程就能看到你的源码文件了。

编写.podspec文件内容

这是比较重要也比较容易写错的一步,示例podspec内容如下

Pod::Spec.new do |s|
s.name = 'MyTestLib' #名称
s.version = '0.1.0' #版本号
s.summary = "Just Testing" #简短介绍,下面是详细介绍
s.description = "This is a test file" # 详细介绍
s.homepage = 'https://gitlab.xxxx.com/myspecs/MyTestLib'
# 项目主页,这里要填写可以访问到的地址,不然验证不通过
s.license = { :type => 'MIT', :file => 'LICENSE' } #开源协议
s.author = { 'zhanghao' => 'zhang60770@163.com' } #作者信息
s.source = { :git => 'https://gitlab.xxxx.com/myspecs/MyTestLib', :tag => s.version.to_s }
# 项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
s.ios.deployment_target = '7.0' #运行需要的最低系统版本
# s.source_files = 'Pod/*.{h,m}'
# 代码源文件地址,**/*表示Classes目录及其子目录下所有文件,
# 如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
s.source_files = 'MyTestLib/Classes/MyTestLib.h'
s.resource = 'MyTestLib/Assets/*.plist' # 资源文件
# 添加子spec
s.subspec 'Core' do |ss|
ss.source_files = 'MyTestLib/Classes/Core/**/*'
ss.public_header_files = 'MyTestLib/Classes/Core/**/*.h'
end
s.subspec 'UIKit' do |ss|
ss.source_files = 'MyTestLib/Classes/UIKit/**/*'
ss.public_header_files = 'MyTestLib/Classes/UIKit/**/*.h'
ss.dependency 'MyTestLib/Core'
end
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end

编写好之后进行提交,并打tag,步骤如下:

git add .
git commit -s -m "First Commit of Lib"
git remote add origin git@gitlab.com:xxxx/MyTest.git #关联远端仓库
git push origin master #一般会push到临时分支然后提PR

添加对应的Tag

git tag -m "first release" 0.1.0
git push --tags

验证podspec文件的正确性

pod spec lint 文件名称.podspec --verbose

忽略警告使用:

pod lib lint --allow-warnings

提交podspec文件到Spec库并使用

pod repo push 仓库名 podspec文件名称.podspec

执行这步之前要确保对应本地私有库已添加成功,就是文章开始的第二段内容!向CocoaPods添加私有仓库

添加成功后可以通过pod repo list的命令查看。也可以搜索检验下是否成功:

pod search 组件名

如果搜索不到,清离搜索缓存再试下

rm ~/Library/Caches/CocoaPods/search_index.json

使用私有pod,在个人项目中的Podfile中增加刚刚制作好的Pod

source 'https://github.com/CocoaPods/Specs.git' #公有库的索引源
source 'https://gitlab.xxxx.com/hao.zhang/MyTestLib.git' #私有库的索引源地址
platform :ios, "8.0"
target 'Test' do
pod 'MyTestLib', '~> 0.1.0'
end

保存后执行pod install,就可以去项目中使用了

问题整理

  1. The URL is not reachable.

    - WARN | url: The URL (https://gitlab.inin88.com/hao01.zhang) is not reachable.

    原因是s.homepage设置的不正确

    参考:https://github.com/CocoaPods/CocoaPods/issues/1998

  2. 如下图中所示

    podsetup01

    podsetup02

    以上两个问题解决方案:

    sudo rm -fr ~/.cocoapods/repos/master && pod setup

    记得先备份下本地master的repo,以防万一更不下来,如果更新成功后还是不能引用所有库,可能是仓库访问地址有问题,将https换成ssh试试!


    发布代码到CocoaPods(Trunk方式)

    另:其实让自己的组件在github也能支持pod,跟这些步骤几乎是一致的,只是最后的sepc文件需要传到官方的specs里,可以通过Trunk推送给Cocoapods服务器,如下:

    1. 首先向trunk服务器查询自己的注册信息
    pod trunk me
    1. 若没有注册,需要注册trunk账号
    pod trunk register 邮箱地址 用户名 -verbose

    该指令会发送一封验证邮件到你的邮箱,在邮箱里直接点击链接完成注册即可;然后重复步骤1查看注册结构

    1. 最后通过终端push对应的podspec,完成开源项目支持Cocoapods的最后一步
    pod trunk push spec文件名.podspec
    // 如果需要忽略警告
    pod trunk push spec文件名.podspec --allow-warnings

    … 更新本地pod依赖库 pod setup ,然后就可以搜索到了…

参考资料

热评文章